import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import { showScreenLoading, hideScreenLoading } from "./loading";
import store from '@/store'
import { getToken, getHardID } from '@/utils/auth'

import defaultSettings from '@/settings'

const { isFromCenter } = defaultSettings


// 创建 axios 实例
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // 请求 URL = 基础 URL + 请求 URL
  withCredentials: true, // 跨域请求时发送 cookies
  timeout: 20000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // if(JSON.stringify(config.data).indexOf('TestMailGlobal')!== -1){
    //   hideScreenLoading(config.headers);
    // }
    if (config.headers.showLoading !== false && JSON.stringify(config.data).indexOf('TestMailGlobal') === -1 && JSON.stringify(config.data).indexOf('GetRealTimeScreenLog') === -1) {
      showScreenLoading(config.headers);
    }
    if (store.getters.token) {
      // 让每个请求携带 token
      // ['X-Token'] 是一个自定义 headers 键
      // 请根据实际情况修改
      config.headers['X-Token'] = getToken()
    }
    if (isFromCenter) {
      if (!config.data.Data) {
        config.data.Data = {}
      }

      const hardID = getHardID()
      if (hardID) {
        config.data.Header.HardID = hardID
      }
    }

    return config
  },
  error => {
    hideScreenLoading(config.headers);
    console.log(error) // 用于调试
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果需要获取 headers 或 status 等 HTTP 信息
   * 请返回 response => response
   */

  /**
   * 通过自定义代码判断请求状态
   * 这里只是一个示例
   * 也可以通过 HTTP 状态码判断
   */
  response => {
    if (response.headers.showLoading !== false) {
      hideScreenLoading();
    }
    let isdownload = response.request.responseURL.indexOf('download') // 下载接口没有 StatusCode
    let isupload = response.request.responseURL.indexOf('upload') // 上传接口没有 StatusCode
    const res = response.data
    if (isdownload === -1 && isupload === -1 && res.Status.StatusCode !== 0) {  //
      if (res.Status.StatusCode === 2000) {
        // store.dispatch('user/resetToken').then(() => {
        //   location.reload()
        // })
        // 重新登录
        MessageBox.alert('登录状态已失效，请重新登录', '登录过期', {
          confirmButtonText: '确定',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/logout').then(() => {
            location.reload()
          })
        })
      } else if (res.Status.StatusCode === 12557) {
        Message({
          message: '您的授权已经过期超过15天，系统禁止登录，请您联系您的服务商。',
          type: 'error',
          duration: 5 * 1000
        })
      } else if (res.Status.StatusCode === 256) {  // 邮箱测试接口返回 256，错误 0x100
        return res
      } else {
        Message({
          message: res.Status.Msg2Client || '错误',
          type: 'error',
          duration: 5 * 1000
        })
      }
      return Promise.reject(new Error(res.Status.Msg2Client || '错误'))
    } else {
      return res
    }
  },
  error => {
    hideScreenLoading();
    console.log('错误' + error) // 用于调试
    Message({
      message: error.message === 'timeout of 20000ms exceeded' ? '请求超时' : error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service